package TestProject01;
//学生管理系统升级（自己写的）
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class UserTest {
    public static void main(String[] args) {

        ArrayList<User> list = new ArrayList<>();

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择你的操作：1、登录；2、注册；3、忘记密码；4、退出");
            String choose = sc.next();
            switch (choose) {
                case "1"://登录
                    denglu(list);
                    break;
                case "2"://注册
                    zhuce(list);
                    System.out.println("当前用户注册成功！");
                    break;
                case "3"://忘记密码
                    wangjimima(list);
                    break;
                case "4"://退出
                    System.exit(0);
                default:
                    System.out.println("没有这个选项，请重新输入：");
            }
        }
    }

    //登录
    /*
    1，键盘录入用户名
    2，键盘录入密码
    3，键盘录入验证码
    验证要求:
        用户名如果未注册，直接结束方法，并提示:用户名未注册，请先注册
        判断验证码是否正确，如不正确，重新输入
            (验证码规则:
                长度为5
                由4位大写或者小写字母和1位数字组成，同一个字母可重复数字可以出现在任意位置
                比如:aQa1K)
        再判断用户名和密码是否正确，有3次机会
*/
    public static void denglu(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入用户名：");
        String username = sc.next();

        int index = getIndex(list, username);
        if (index == -1) {
            System.out.println("用户名未注册，请先注册！");
            return;
        } else {
            User user = list.get(index);

            int count = 0;
            for (int i = 0; i < 3; i++) {
                System.out.println("请输入密码：");
                String password = sc.next();
                if (password.equals(user.getPassword())) {
                    String yanzhengma = getNumber();
                    System.out.println(yanzhengma);
                    System.out.println("请输入验证码：");
                    String shuruyanzhengma = sc.next();
                    if (shuruyanzhengma.equals(yanzhengma)) {
                        System.out.println("登录成功！");
                    } else {
                        System.out.println("验证码错误！");
                    }
                } else {
                    System.out.println("密码错误," + (2 - i) + "次机会");
                    count++;
                }
                if (count == 3) {
                    break;
                }
            }
        }
    }

    //注册
    /*
    1，用户名需要满足以下要求:
        验证要求:
            用户名唯一
            用户名长度必须在3~15位之间
            只能是字母加数字的组合，但是不能是纯数字
    2，密码键盘输入两次，两次一致才可以进行注册。
    3，身份证号码需要验证。
        验证要求:
            长度为18位
            不能以0为开头
            前17位，必须都是数字
            最为一位可以是数字，也可以是大写X或小写x
    4，手机号验证。
        验证要求:
        长度为11位
        不能以0为开头
        必须都是数字
    */
    public static void zhuce(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);

        //用户名
        String username = null;
        loop1:
        while (true) {
            System.out.println("请输入用户名：");
            username = sc.next();
            int index = getIndex(list, username);
            if (index >= 0) {
                System.out.println("用户名已存在，请重新输入：");
                continue;
            }

            int len = username.length();
            if (len < 3 || len > 15) {
                System.out.println("用户名长度不符合规则，请重新输入：");
                continue;
            }

            int count = 0;
            for (int i = 0; i < username.length(); i++) {
                char c = username.charAt(i);
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) {
                    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                        count++;
                    }
                } else {
                    System.out.println("当前用户名不符合条件！");
                    continue loop1;
                }
            }

            if (count == 0) {
                System.out.println("用户名不能为全数字！");
                continue;
            }
            break;
        }

        System.out.println("用户名使用成功！");


        //密码
        String password = null;
        while (true) {
            System.out.println("请第一次输入密码：");
            String password1 = sc.next();
            System.out.println("请第二次输入密码：");
            String password2 = sc.next();

            if (password1.equals(password2)) {
                password = password1;
                System.out.println("密码符合要求！");
                System.out.println("密码使用成功！");
                break;
            } else {
                System.out.println("密码不符合要求！");
            }
        }


        //身份证号码
        String personId = null;
        loop2:
        while (true) {
            System.out.println("请输入身份证号码：");
            personId = sc.next();
            if (personId.length() != 18) {
                System.out.println("当前身份证号码长度不符合！");
                continue;
            }

            char c1 = personId.charAt(0);
            if (c1 == '0') {
                System.out.println("身份证号码不能以0开头");
                continue;
            }

            for (int i = 0; i < personId.length() - 1; i++) {
                char c2 = personId.charAt(i);
                if (c2 < '0' || c2 > '9') {
                    System.out.println("前17为数字不符合规则！");
                    continue loop2;
                }
            }

            char c3 = personId.charAt(17);
            if (c3 >= '0' || c3 <= '9' || c3 == 'X' || c3 == 'x') {
                System.out.println("当前身份证号码符合规范！");
                break;
            }
        }


        //手机号码
        String phoneNumber = null;
        loop3:
        while (true) {
            System.out.println("请输入手机号码：");
            phoneNumber = sc.next();
            if (phoneNumber.length() != 11) {
                System.out.println("手机号码长度不符合！");
                continue;
            }

            char c1 = phoneNumber.charAt(0);
            if (c1 == '0') {
                System.out.println("手机号码不能以0开头！");
                continue;
            }

            for (int i = 0; i < phoneNumber.length(); i++) {
                char c2 = phoneNumber.charAt(i);
                if (c2 < '0' || c2 > '9') {
                    System.out.println("手机号码不符合规则！");
                    continue loop3;
                }
                break loop3;
            }
        }
        System.out.println("当前手机号码可以使用！");

        //将用户对象添加到集合中
        User user = new User(username, password, personId, phoneNumber);
        list.add(user);
    }

    //忘记密码
    /*
      1，键盘录入用户名，判断当前用户名是否存在，如不存在，直接结束方法，并提示:未注册
      2，键盘录入身份证号码和手机号码
      3，判断当前用户的身份证号码和手机号码是否一致，
           如果一致，则提示输入密码，进行修改。
           如果不一致，则提示:账号信息不匹配，修改失败。
    */
    public static void wangjimima(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String username = sc.next();

        int index = getIndex(list, username);
        if (index == -1) {
            System.out.println("用户未注册！");
            return;
        } else {
            User user = list.get(index);

            System.out.println("请输入身份证号码：");
            String personId = sc.next();
            if (personId.equals(user.getPersonId())) {
                System.out.println("请输入手机号码：");
                String phoneNumber = sc.next();
                if (phoneNumber.equals(user.getPhoneNumber())) {
                    System.out.println("请输入密码：");
                    String password = sc.next();
                    user.setPassword(password);
                    System.out.println("密码修改成功！");
                } else {
                    System.out.println("手机号码错误！");
                }
            } else {
                System.out.println("身份证号码错误！");
            }
        }
    }

    //获取验证码
    public static String getNumber() {
        Random r = new Random();
        char[] arr1 = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
                'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

        String str = "";
        for (int i = 0; i < 4; i++) {
            int index1 = r.nextInt(arr1.length);
            str = str + arr1[index1];
        }

        int[] arr2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int index2 = r.nextInt(arr2.length);
        str = str + arr2[index2];

        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);
            char temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

        String newStr = new String(arr);
        return newStr;
    }

    //定义方法判断用户名是否存在
    public static boolean contains(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            String name = user.getUsername();
            if (username.equals(name)) {
                return true;
            }
        }
        return false;
    }

    //定义方法判断用户名是否存在(索引)
    public static int getIndex(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            String name = user.getUsername();
            if (username.equals(name)) {
                return i;
            }
        }
        return -1;
    }
}
